package com.example.clouddisk.utils;

import com.example.clouddisk.entity.UploadFile;
import org.apache.commons.io.FileUtils;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;

import java.io.File;
import java.io.IOException;
import java.nio.charset.StandardCharsets;

/**
 * @author 14820
 */
public class FileUtil {

    public static ResponseEntity<byte[]> createResponseEntityByFileInfo(UploadFile uploadFile, String filePath){
        HttpHeaders httpHeaders = new HttpHeaders();
        String downloadName = "downloadError";
        if (uploadFile != null && uploadFile.getFileName() != null){
            // 处理文件名是中文时下载后的文件无法识别的情况

            /** 这里使用了new String(uploadFile.getFileName().getBytes(StandardCharsets.UTF_8), StandardCharsets.ISO_8859_1)来进行编码。
             *  这是因为RFC 5987要求使用ISO-8859-1字符集来表示encoded-word中的字符，而文件名实际上是UTF-8编码的。因此，我们首先将文件名转换为字节数组（使用UTF-8编码），然后再将这些字节解释为ISO-8859-1编码的字符串。
             *  这种方法是一种折衷方案，因为HTTP头原本并不支持UTF-8编码的字符串。现代浏览器通常能够处理这种编码方式，但旧版浏览器或某些特定环境可能会有问题。
             *  另一种更现代的方法是使用RFC 6266的encoding=UTF-8语法，但这需要确保客户端（即浏览器）支持这种语法。不是所有的浏览器都支持在Content-Disposition头中使用encoding=UTF-8。
             *  如果应用环境允许，并且能够控制客户端的行为，那么使用RFC 6266可能是更好的选择。否则，使用上述RFC 5987的编码方法通常能够提供更好的兼容性。
             */

            // downloadName = uploadFile.getFileName();
           // 对文件名进行RFC 5987编码
            String encodeFileName = new String(uploadFile.getFileName().getBytes(StandardCharsets.UTF_8), StandardCharsets.ISO_8859_1);
            httpHeaders.setContentDispositionFormData("attachment", encodeFileName);

            // 如果需要的话，可以添加字符集标记，但通常不需要，因为大多数现代浏览器都能处理ISO-8859-1中的encoded-word
            // encodedFileName += "; charset=UTF-8";  // 通常不需要这一行
        } else {
            httpHeaders.setContentDispositionFormData("attachment",   downloadName);
        }

        httpHeaders.setContentType(MediaType.APPLICATION_OCTET_STREAM);
        byte[] bytes = null;
        File file = new File(filePath + (uploadFile != null ? uploadFile.getMappingName() : null));
        if (file.exists()) {
            try {
                bytes = FileUtils.readFileToByteArray(file);
            } catch (IOException e) {
                downloadName = "downloadError";
                e.printStackTrace();
            }
        }
        return new ResponseEntity<>(bytes, httpHeaders, HttpStatus.CREATED);
    }
}
